package com.reservation.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.reservation.entity.Exhibition;

import java.time.LocalDate;
import java.util.List;

/**
 * 展览服务接口
 */
public interface ExhibitionService {
    
    /**
     * 添加展览
     *
     * @param exhibition 展览信息
     * @return 添加成功的展览信息
     */
    Exhibition addExhibition(Exhibition exhibition);
    
    /**
     * 修改展览信息
     *
     * @param exhibition 展览信息
     * @return 修改后的展览信息
     */
    Exhibition updateExhibition(Exhibition exhibition);
    
    /**
     * 获取展览详情
     *
     * @param id 展览ID
     * @return 展览信息
     */
    Exhibition getExhibitionById(Long id);
    
    /**
     * 删除展览
     *
     * @param id 展览ID
     * @return 是否成功
     */
    boolean deleteExhibition(Long id);
    
    /**
     * 分页查询展览列表
     *
     * @param page     分页参数
     * @param name     展览名称（可选）
     * @param status   展览状态（可选）
     * @param location 展览地点（可选）
     * @return 展览列表
     */
    IPage<Exhibition> getExhibitionList(Page<Exhibition> page, String name, String status, String location);
    
    /**
     * 获取所有展览
     *
     * @return 展览列表
     */
    List<Exhibition> getAllExhibitions();
    
    /**
     * 获取正在进行的展览
     *
     * @return 展览列表
     */
    List<Exhibition> getOngoingExhibitions();
    
    /**
     * 获取即将开始的展览
     *
     * @return 展览列表
     */
    List<Exhibition> getUpcomingExhibitions();
    
    /**
     * 更新展览状态
     * 
     * @param id 展览ID
     * @param status 展览状态
     * @return 更新后的展览信息
     */
    Exhibition updateExhibitionStatus(Long id, String status);
    
    /**
     * 检查日期是否可预约
     * 
     * @param exhibitionId 展览ID
     * @param date 预约日期
     * @return 是否可预约
     */
    boolean checkDateAvailable(Long exhibitionId, LocalDate date);
    
    /**
     * 获取某日期的预约人数
     * 
     * @param exhibitionId 展览ID
     * @param date 预约日期
     * @return 已预约人数
     */
    int getReservationCount(Long exhibitionId, LocalDate date);
}